﻿// moving_average.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>

using namespace std;

class MovingAverage
{
public:
    int limit;
    queue<int>oh_q;
    vector<int>cache_vec;
    MovingAverage(int number)
    {
        limit = number;
    };

    //double next(int val)
    double next(int val)
    {
        if (oh_q.size() + 1 <= limit)
        {
            oh_q.push(val);
        }
        else {
            oh_q.pop();
            oh_q.push(val);
        }

        cache_vec.clear();
        while (!oh_q.empty())
        {
            int curr = oh_q.front();
            cache_vec.push_back(curr);
            oh_q.pop();
        }

        double result = 0;
        for (auto& item : cache_vec)
        {
            oh_q.push(item);
            result += item;
        }
        result = result / oh_q.size();
        return result;
    }

};

int main()
{
    /*
    输入：
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出：
[null, 1.0, 5.5, 4.66667, 6.0]

解释：
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
    */
    MovingAverage oh_aver(3);
    cout << oh_aver.next(1) << endl;
    cout << oh_aver.next(10) << endl;
    cout << oh_aver.next(3) << endl;
    cout << oh_aver.next(5) << endl;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
